home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1 Issue 2 / PDCD-1 - Issue 02.iso / _utilities / utilities / 001 / overfiler / !OverFiler / 0_05 (.txt) < prev    next >
RISC OS BBC BASIC V Source  |  1994-10-15  |  81KB  |  1,540 lines

  1.  >OverFiler:0_05
  2.  Allow objects to be dragged to FileCore icon filer
  3.  David G Jones, 1994
  4.  This software is PD, do what you will with it.
  5. $; " (Error code "; 
  6. ); ")": 
  7. prog$ = "OverFiler"
  8. vers$ = "0.05"
  9. date$ = "15 Oct 1994"
  10. command$="Desktop_" + prog$
  11. cUpdate% = 100                                         :
  12.  Number of centiseconds between testing
  13. 0bl$ = 
  14. (0): cr$ = 
  15. (13): nl$ = 
  16. (10) + 
  17. "Service_Reset            = &27
  18. XService_StartWimp        = &49 :
  19.  Use *Wimp versions so we start up after all Filers
  20. %Service_StartedWimp      = &4A :
  21. "Service_WimpSaveDesktop  = &5C
  22.  Layout of OverDrive for one drive
  23. "                       A%  = 0
  24. LOD_Icon%         = A%: A% += 4: 
  25.  Current icon number in icon bar window
  26. :OD_Drive%        = A%: A% += 4: 
  27.  Drive number [0 - 7]
  28. KOD_Task%         = A%: A% += 4: 
  29.  Task handle of original owner of icon
  30. AOD_Flags%        = A%: A% += 4: 
  31.  Word. Details of bits below
  32. YOD_Sequence%     = A%: A% += 4: 
  33.  Sequence number of accessing Poll changed for drive
  34. 6OD_IWidth%       = A%: A% += 4: 
  35.  Icon width in EC
  36. 8OD_SWidth%       = A%: A% += 4: 
  37.  Sprite width in EC
  38. :OD_FSNumber%     = A%: A% += 4: 
  39.  Filing system number
  40.  TOD_DescribeDisc% = A%: A% += 4: 
  41.  SWI "Xfs_DescriveDisc" instruction for this FS
  42. !TOD_MiscOp%       = A%: A% += 4: 
  43.  SWI "Xfs_MiscOp"       instruction for this FS
  44. "8OD_FSName%       = A%: A% +=12: 
  45.  Filing system name
  46. #HOD_IName%        = A%: A% +=12: 
  47.  Icon name, either :0, or disc name
  48. $7OD_ISprite%      = A%: A% +=12: 
  49.  "S" + sprite name
  50. %?OD_IPriority%    = A%: A% += 4: 
  51.  Icon priority on icon bar
  52. &MOD_OldIcon%      = A%: A% += 4: 
  53.  Original icon number from original task
  54. 'cOD_OldIconData%  = A%: A% +=36: 
  55.  Actual data to recreate original icon (+4 for fiddling space)
  56. (DOD_Next%         = A%: A% += 4: 
  57.  Pointer to next drive. 0 = end
  58. OD_Size%         = A%
  59.  Details of OD_Flags% word
  60. ,PFlags_Directory%   = 1<<  0  :
  61.  Display drive directory if new disc inserted
  62. -PFlags_Poll%        = 1<<  1  :
  63.  Whether drive should be tested every Update%
  64. .8Flags_Hard%        = 1<<  2  :
  65.  Drive is a Hard disc
  66. /ZFlags_SprCorrupt%  = 1<<  3  :
  67.  Can't find a sprite for the drive so just use standard
  68. 0TFlags_Added%       = 1<<  4  :
  69.  Drive added,   but details not yet known by WIMP
  70. 1TFlags_Removed%     = 1<<  5  :
  71.  Drive removed, but details not yet known by WIMP
  72. 2cFlags_FullProcess% = 1<<  6  :
  73.  Ensure that a suitable name, etc is written into icon this poll
  74. 3DFlags_DiscCorrupt% = 1<<  7  :
  75.  Current disc in drive is corrupt
  76. 42Flags_Empty%       = 1<<  8  :
  77.  Drive is empty
  78. 5GFlags_ModeSame%    = 1<<  9  :
  79.  If there has NOT been a mode change
  80. 6dFlags_FinalRemove% = 1<< 10  :
  81.  Drive removed, and original icon reinserted within original task
  82. 7DFlags_Priority%    = 1<< 11  :
  83.  Priority value explicitly stated
  84. 8DFlags_SprOverload% = 1<< 12  :
  85.  A sprite was explicitly supplied
  86. 9bFlags_Click%       = 1<< 13  :
  87.  Update icon display when icon is clicked (ie reverse of -Poll)
  88. :XFlags_NoIcon%      = 1<< 14  :
  89.  There actually was not such an original icon defined
  90.  Set out of Data. If changed see .ProtoDT
  91. =(                            A%  =  0
  92. >ADT_TaskHandle%         = A%:A% +=  4: 
  93.  OverFiler task handle
  94. ?_DT_DrivesPending%      = A%:A% +=  4: 
  95.  != 0 means Add/Remove waiting for WIMP to come back
  96. @HDT_Drives%             = A%:A% +=  4: 
  97.  Pointer to first Drive entry
  98. AZDT_HelpTask%           = A%:A% +=  4: 
  99.  Task handle from sender of Message_HelpRequest
  100. B_DT_FilerSelect_Column% = A%:A% +=  4: 
  101.  End column of selection from Message_FilerSelection
  102. C_DT_FilerSelect_Row%    = A%:A% +=  4: 
  103.  End row    of selection from Nessage_FilerSelection
  104. DfDT_DataLoad%           = A%:A% +=  4: 
  105.  -2 DataSave; -1 No select; 0 First in select; +ve select X
  106. EaDT_UpdateIcon%         = A%:A% += 16: 
  107.  Suitale blank Wimp_UpdateIcon block to redraw an icon
  108. FJDT_InlineSWI%          = A%:A% +=  8: 
  109.  Area for a SWI X & mov pc, r14
  110. GMDT_WimpPollRoutine%    = A%:A% +=  4: 
  111.  Address of current Wimp_Poll loop
  112. HiDT_CloseDownRoutine%   = A%:A% +=  4: 
  113.  Address of routine we should execute application in emergency
  114. IcDT_FilerAction_Reason% = A%:A% +=  4: 
  115.  Reason code we are going to send to our FileAction task
  116. JJDT_FilerAction_Task%   = A%:A% +=  4: 
  117.  Task handle for our FileAction
  118. K;DT_XEigfactor%         = A%:A% +=  4: 
  119.  Current modes X
  120. LaDT_Space%              = A%:A% +=256: 
  121.  For Wimp_Poll and general sandpit area for playing in
  122. MW                            A% +=128: 
  123.  Space for a few register saves in the stack
  124. DT_Stack%              = A%
  125. DT_Size%               = A%
  126.  OS_WriteI = &100
  127. R!XOS_WriteI = &100 
  128.  (1 << 17)
  129. assembly
  130.  "OS_File", 10, prog$, &FFA,, code, O%
  131. assembly
  132. rDrive = 10
  133.  code 16383
  134.  pass% = 4 
  135. O% = code: P% = 0
  136. [ OPT pass%
  137. ^!                equd    start
  138. _&                equd    initialize
  139. `$                equd    finalize
  140. a'                equd    serviceCall
  141. b'                equd    titleString
  142. c&                equd    helpString
  143. d$                equd    keyWords
  144.                 equd    0
  145.                 equd    0
  146.                 equd    0
  147.                 equd    0
  148. j-.titleString    equs    prog$ +bl$: align
  149. kd.helpString     equs    prog$+
  150. (9)+vers$+" ("+date$+") David G Jones (Public Domain)"+bl$: align
  151. .keyWords
  152. n/.startUpName    equs    command$+bl$: align
  153. o'                equd    startUpComm
  154.                 equd    0
  155. q'                equd    startUpHelp
  156. r'                equd    startUpHelp
  157. s4.addName        equs    prog$+"_Add" +bl$: align
  158. t#                equd    addComm
  159. u'                equd    &0000080003
  160. v#                equd    addHelp
  161. w#                equd    addHelp
  162. x7.drivesName     equs    prog$+"_Drives" +bl$: align
  163. y&                equd    drivesComm
  164.                 equd    0
  165. {&                equd    drivesHelp
  166. |&                equd    drivesHelp
  167. }7.removeName     equs    prog$+"_Remove" +bl$: align
  168. ~&                equd    removeComm
  169. '                equd    &0000020002
  170. &                equd    removeHelp
  171. &                equd    removeHelp
  172. .keyWords_end   equd    0
  173. g                equd 0                                ; So we can use startUpHelp as an error block
  174. .startUpHelp    equs "The "+prog$+" allows files to be dragged over FileCore drive icons. Drive icons also reflect discs in drive."+nl$
  175. N                equs "Do not use *"+command$+", use *Desktop instead."+nl$
  176. 6                equs "Syntax: *Desktop_"+prog$+bl$
  177.                 align
  178. /.startUpComm   stmfd   r13!, {r0 - r2, r14}
  179. !               mov     r2, r0
  180. O               mov     r0, #3                         ; Command mode or not
  181. .               swi     "XWimp_ReadSysInfo"
  182. .               ldmVSfd r13!, {r0 - r2, pc}
  183. P               teq     r0, #0                         ; Is the wimp running?
  184. H               adrEQ   r0, startUpHelp                ; >No  So barf
  185. -               swiEQ   "OS_GenerateError"
  186. *               adr     r1, titleString
  187. H               mov     r0, #2                         ; Enter module
  188. '               swi     "XOS_Module"
  189. .               ldmfd   r13!, {r0 - r2, pc}
  190. n.addHelp       equs "OverFiler_Add will replace a FileCore filer icon bar icon with a super version." +nl$
  191.                equs "Syntax: *OverFiler_Add <drive> <FSname> <iconnumber> [-Directory] [-Poll] [-Priority <priority>] [-Sprite <name>] [-Click]" +bl$
  192.                align
  193. n.addReadArgs   equs "drive/E/A,fs/A,icon/E/A,directory/S,poll/S,priority/E/K,sprite/K,click/S" +bl$: align
  194. 2.addComm       stmfd   r13!, {r9, rDrive, r14}
  195. %               ldr     r12, [r12]
  196. Y               ldr     rDrive, [r12, #DT_Drives%]     ;*rDrive => Head of drive chain
  197. ; process command arguments
  198. !               mov     r1, r0
  199. *               adr     r0, addReadArgs
  200. .               add     r2, r12, #DT_Space%
  201. #               mov     r3, #256
  202. )               swi     "XOS_ReadArgs"
  203. E; Create new block of memory for drive and connect to drive chain
  204. G               movVC   r0, #6                         ; Claim block
  205. (               movVC   r3, #OD_Size%
  206. '               swiVC   "XOS_Module"
  207. '               bVS     addComm_exit
  208. ^               str     rDrive, [r2, #OD_Next%]        ; Connect rest of chain to new drive
  209. X               str     r2, [r12, #DT_Drives%]         ; Store drive at head of chain
  210. V               mov     rDrive, r2                     ; Now process this new drive
  211. ; Read in arguments
  212. `               mov     r9, #Flags_Added% + Flags_FullProcess% + Flags_ModeSame%;*r9 == Flags
  213. H               ldr     r0, [r12, #0 +DT_Space%]       ; Drive number
  214. %               add     r0, r0, #1
  215. #               bL      loadWord
  216. d               cmp     r1, #7                         ; FileCore drives are in the range [0 - 7]
  217. X               adrHI   r0, addComm_err0               ; Illegal drive number so barf
  218. '               bHI     addComm_fail
  219. 3               str     r1, [rDrive, #OD_Drive%]
  220. V               cmp     r1, #4                         ; Is it a floppy/hard drive?
  221. %               rsb     r0, r1, #7
  222. I               movLT   r1, #&60000000                 ; >Floppy drive
  223. G               movGE   r1, #&70000000                 ; >Hard drive
  224. \               orrGE   r9, r9, #Flags_Hard%           ;               Remember it aswell
  225. h               add     r1, r1, r0                     ; Order icons with Priority group on their dri
  226. 7               str     r1, [rDrive, #OD_IPriority%]
  227. B               ldr     r0, [r12, #4 +DT_Space%]       ; FSname
  228. 2               add     r1, rDrive, #OD_FSName%
  229. !               bl      strcpy
  230. G               ldr     r0, [r12, #8 +DT_Space%]       ; Icon number
  231. %               add     r0, r0, #1
  232. #               bl      loadWord
  233. 2               str     r1, [rDrive, #OD_Icon%]
  234. 5               str     r1, [rDrive, #OD_OldIcon%]
  235. E               ldr     r0, [r12, #12 +DT_Space%]      ; Directory
  236. !               teq     r0, #0
  237. 4               orrNE   r9, r9, #Flags_Directory%
  238. @               ldr     r0, [r12, #16 +DT_Space%]      ; Poll
  239. !               teq     r0, #0
  240. /               orrNE   r9, r9, #Flags_Poll%
  241. I               ldr     r0, [r12, #20 +DT_Space%]      ; Icon priority
  242. !               teq     r0, #0
  243. 3               orrNE   r9, r9, #Flags_Priority%
  244. %               addNE   r0, r0, #1
  245. #               blNE    loadWord
  246. 7               strNE   r1, [rDrive, #OD_IPriority%]
  247. G               ldr     r0, [r12, #24 +DT_Space%]      ; Sprite name
  248. !               teq     r0, #0
  249. 5               orrNE   r9, r9, #Flags_SprCorrupt%
  250. 6               orrNE   r9, r9, #Flags_SprOverload%
  251. 6               addNE   r1, rDrive, #OD_ISprite% +1
  252. !               blNE    strcpy
  253. A               ldr     r0, [r12, #28 +DT_Space%]      ; Click
  254. !               teq     r0, #0
  255. 0               orrNE   r9, r9, #Flags_Click%
  256. 8; Now initialize rest of structure to default values
  257. !               mov     r0, #0
  258. 2               str     r0, [rDrive, #OD_Task%]
  259. 6               str     r0, [rDrive, #OD_Sequence%]
  260. 4               str     r0, [rDrive, #OD_IWidth%]
  261. 4               str     r0, [rDrive, #OD_SWidth%]
  262. T               str     r0, [rDrive, #OD_FSNumber%]    ; No FS number (presently)
  263. E               str     r0, [rDrive, #OD_DescribeDisc%]; Excessive
  264. E               str     r0, [rDrive, #OD_MiscOp%]      ; Excessive
  265. 3               str     r0, [rDrive, #OD_IName%]
  266. 3               add     r1, rDrive, #OD_ISprite%
  267. f               mov r0, #
  268. ("S"): strB r0, [r1], #1   ; Set first char to 'S' for Spite name command
  269. ]               tst     r9, #Flags_SprCorrupt%         ; Has the user set the sprite name?
  270. f               addEQ   r0, rDrive, #OD_FSName%        ; >No  So generate ours from FS and tail 'i'
  271. !               blEQ    strcpy
  272. 3               ldrEQ   r0, [rDrive, #OD_Drive%]
  273. *               addEQ   r0, r0, #
  274. ("0")
  275. )               strEQB    r0, [r1], #1
  276. d               movEQ r0, #
  277. ("i"):strEQB r0, [r1], #1; Set initially disc to be inserted in drive
  278. 6               movEQ r0, #     0  :strEQB r0, [r1]
  279. 3               str     r9, [rDrive, #OD_Flags%]
  280. 9; Setup to tell WIMP about all our devilish going ons
  281. 8               ldr     r0, [r12, #DT_DrivesPending%]
  282. %               add     r0, r0, #1
  283. 8               str     r0, [r12, #DT_DrivesPending%]
  284. 1.addComm_exit  ldmfd   r13!, {r9, rDrive, pc}
  285. P.addComm_err0  equd 0: equs "Drive must be within range [0 - 7]" +bl$: align
  286. Y; Any errors encountered which lead to the new proto drive entry having to be deleted
  287. !.addComm_fail  mov     r1, r0
  288. 2               ldr     r3, [rDrive, #OD_Next%]
  289. @               mov     r0, #7                         ; Free
  290. %               mov     r2, rDrive
  291. '               swi     "XOS_Module"
  292. !               movVC   r0, r1
  293. 1               str     r3, [r12, #DT_Drives%]
  294. K               swiVC   "XOS_GenerateError"            ; Ensure Vbit set
  295. 1               ldmfd   r13!, {r9, rDrive, pc}
  296. c.drivesHelp    equs "OverFiler_Drives displays all the drives which have been taken over." +nl$
  297. 8               equs "Syntax: *OverFiler_Drives" +bl$
  298.                align
  299. F.drivesHeader  equs " D FS   Icon    .NCOPRMECFRASHPD" +bl$: align
  300. ..drivesComm    stmfd   r13!, {rDrive, r14}
  301. %               ldr     r12, [r12]
  302. O               mov     r3, #9                         ;*r3 == Tab character
  303.     V               add     r4, r12, #DT_Space%            ;*r4 => Output string buffer
  304. O               mov     r5, #
  305. (" ")                  ;*r5 == Space character
  306. 5               ldr     rDrive, [r12, #DT_Drives%]
  307. %               teq     rDrive, #0
  308. -               ldmEQfd r13!, {rDrive, pc}
  309. >; Write a hopefully helpful header string outlining fields
  310. +               adr     r0, drivesHeader
  311. '               swi     "XOS_Write0"
  312. (               swiVC   "XOS_NewLine"
  313. J               mov     r0, #32                        ;.Draw separator
  314. ..loop          swiVC   XOS_WriteI + 
  315. ("-")
  316. %               subS    r0, r0, #1
  317.                bGT     loop
  318. (               swiVC   "XOS_NewLine"
  319. -               ldmVSfd r13!, {rDrive, pc}
  320.  ; Now print each drive entry
  321. %.loop          teq     rDrive, #0
  322. F               ldmEQfd r13!, {rDrive, pc}             ; ***Exit***
  323. !               mov     r1, r4
  324. 3               ldr     r2, [rDrive, #OD_Flags%]
  325. ,               tst     r2, #Flags_Added%
  326. S               movNE r0, #
  327. ("+"):strNEB r0, [r1], #1; Drive waiting to be added
  328. V               tst     r2, #Flags_Removed%            ; /\Not mutually exlcusive\/
  329.  U               movNE r0, #
  330. ("-"):strNEB r0, [r1], #1; Drive waiting to be removed
  331. !=               tst     r2, #Flags_Removed% + Flags_Added%
  332. "^               movEQ r0, #     31 :strEQB r0, [r1], #1; No executive action wainting drive
  333. #H               ldr     r0, [rDrive, #OD_Drive%]       ; Drive number
  334. $#               mov     r2, #128
  335. %1               swi     "XOS_ConvertCardinal1"
  336. &'               strVCB  r5, [r1], #1
  337. 'C               addVC   r0, rDrive, #OD_FSName%        ; FS name
  338. (!               blVC    strcpy
  339. )'               strVCB  r3, [r1], #1
  340. *d               ldrVC   r0, [rDrive, #OD_OldIcon%]     ; Old icon number (for original Filer app)
  341. +1               swiVC   "XOS_ConvertCardinal1"
  342. ,'               strVCB  r5, [r1], #1
  343. -O               ldrVC   r0, [rDrive, #OD_Icon%]        ; Current icon number
  344. .1               swiVC   "XOS_ConvertCardinal1"
  345. /'               strVCB  r3, [r1], #1
  346. 0O               ldrVC   r0, [rDrive, #OD_Flags%]       ; Current drive flags
  347. 1/               swiVC   "XOS_ConvertBinary2"
  348. 2!               movVC   r0, r4
  349. 3Z               movVC   r1, #0                         ; Use internal RiscOS dictionary
  350. 4M               movVC   r2, #0                         ; No special string
  351. 5,               swiVC   "XOS_PrettyPrint"
  352. 6(               swiVC   "XOS_NewLine"
  353. 76               ldrVC   rDrive, [rDrive, #OD_Next%]
  354.                bVC     loop
  355. 9,               ldmfd  r13!, {rDrive, pc}
  356. .removeHelp    equs "OverFiler_Remove allows single drive entries to be forgotten. Icon will be replaced by the original version." +nl$
  357. <I               equs "Syntax: *Overfiler_Remove <drive> <FSname>" +bl$
  358.                align
  359. ?5.removeReadArgs equs "drive/E/A,fs/A" +bl$: align
  360. A&.removeComm    stmfd   r13!, {r14}
  361. BG               ldr     r12, [r12]                     ; r12 => Data
  362. C!               mov     r1, r0
  363. D-               adr     r0, removeReadArgs
  364. E.               add     r2, r12, #DT_Space%
  365. F#               mov     r3, #256
  366. G)               swi     "XOS_ReadArgs"
  367. H%               ldmVSfd r13!, {pc}
  368. I:               ldr     r0, [r2, #0]                   
  369. J%               add     r0, r0, #1
  370. K#               bL      loadWord
  371. LV               mov     r4, r1                         ;*r4 == desired Drive number
  372. MQ               ldr     r1, [r2, #4]                   ;*r1 => desired FS name
  373. NM               ldr     r2, [r12, #DT_Drives%]         ;*r2 => Drive entry
  374. OX.loop          teq     r2, #0                         ; Is this a valid drive entry?
  375. P[               bEQ     removeComm_fail                ; >No ***Exit*** @Drive not found
  376. QR               ldr     r3, [r2, #OD_Next%]            ;*r3 => Next Drive entry
  377. R/               ldr     r0, [r2, #OD_Drive%]
  378. SQ               teq     r0, r4                         ; Correct drive number?
  379. T.               addEQ   r0, r2, #OD_FSName%
  380. U!               blEQ    strcmp
  381. V!               movNE   r2, r3
  382.                bNE     loop
  383. ; now delete the drive
  384. Y/               ldr     r0, [r2, #OD_Flags%]
  385. Z2               orr     r0, r0, #Flags_Removed%
  386. [/               str     r0, [r2, #OD_Flags%]
  387. \8               ldr     r0, [r12, #DT_DrivesPending%]
  388. ]%               add     r0, r0, #1
  389. ^8               str     r0, [r12, #DT_DrivesPending%]
  390. _%               ldmfd   r13!, {pc}
  391. .removeComm_fail
  392. a.               adr     r0, removeComm_err0
  393. bK               swi     "XOS_GenerateError"            ; Ensure Vbit set
  394. c%               ldmfd   r13!, {pc}
  395. dW.removeComm_err0 equd 0: equs "Could not find suitable drive to remove" +bl$: align
  396. f1.serviceCall   teq     r1, #Service_StartWimp
  397. g3               teqNE   r1, #Service_StartedWimp
  398. h-               teqNE   r1, #Service_Reset
  399. i7               teqNE   r1, #Service_WimpSaveDesktop
  400. j"               movNES  pc, r14
  401. l1               teq     r1, #Service_StartWimp
  402. m$               bEQ     startWimp
  403. n3               teq     r1, #Service_StartedWimp
  404. o&               bEQ     startedWimp
  405. p-               teq     r1, #Service_Reset
  406. q'               bEQ     serviceReset
  407. r7               teq     r1, #Service_WimpSaveDesktop
  408. s*               bEQ     wimpSaveDesktop
  409. t"               movS    pc, r14
  410. w*.startWimp     stmfd   r13!, {r2, r14}
  411. x%               ldr     r12, [r12]
  412. y5               ldr     r2, [r12, #DT_TaskHandle%]
  413. z!               teq     r2, #0
  414. {!               mvnEQ   r2, #0
  415. |5               strEQ   r2, [r12, #DT_TaskHandle%]
  416. }.               
  417. adrl("EQ", 0, startUpName)
  418. ~!               movEQ   r1, #0
  419. *               ldmfd   r13!, {r2, pc}^
  420. *.startedWimp   stmfd   r13!, {r2, r14}
  421. %               ldr     r12, [r12]
  422. 5               ldr     r2, [r12, #DT_TaskHandle%]
  423. !               cmn     r2, #1
  424. !               movEQ   r2, #0
  425. 5               strEQ   r2, [r12, #DT_TaskHandle%]
  426. *               ldmfd   r13!, {r2, pc}^
  427. *.serviceReset  stmfd   r13!, {r2, r14}
  428. %               ldr     r12, [r12]
  429. !               mov     r2, #0
  430. 5               str     r2, [r12, #DT_TaskHandle%]
  431. *               ldmfd   r13!, {r2, pc}^
  432. .wimpSaveDesktop
  433. 7               stmfd   r13!, {r0 - r6, rDrive, r14}
  434. %               ldr     r12, [r12]
  435. M               mov     r5, r2                         ;*r5 == File handle
  436. (               adr     r0, SD_OFPath
  437. .               add     r1, r12, #DT_Space%
  438. C               mov     r2, #
  439. ("/")                  ; / == *Run
  440. '               strB    r2, [r1], #1
  441. #               mov     r2, #255
  442. !               mov     r3, #0
  443. Z               mov     r4, #3                         ; Want expanded string on return
  444. +               swi     "XOS_ReadVarVal"
  445. %               addVC   r1, r1, r2
  446. %               adrVC   r0, SD_Run
  447. !               blVC    strcpy
  448. N               movVC   r0, #10                        ; Linefeed character
  449. (               strVCB   r0, [r1], #1
  450. K               addVC   r3, r2, #1 + 4 + 1             ; Number of chars
  451. .               addVC   r2, r12, #DT_Space%
  452. !               movVC   r1, r5
  453. ]               movVC   r0, #2                         ; Write bytes from current position
  454. %               swiVC   "XOS_GBPB"
  455. /               bVS     wimpSaveDesktop_fail
  456. 3; Set up command to regenerate each drive entry
  457. Y               ldr     rDrive, [r12, #DT_Drives%]     ;*rDrive => Current drive entry
  458. O               mov     r6, #
  459. (" ")                  ;*r6 == Space character
  460. %.loop          teq     rDrive, #0
  461. 7               ldmEQfd r13!, {r0 - r6, rDrive, pc}^
  462. :               add     r1, r12, #DT_Space%            
  463. _               ldr     r4, [rDrive, #OD_Flags%]       ;*r4 == Flags for current drive entry
  464. '               adr     r0, SD_OFAdd
  465. !               bl      strcpy
  466. H               ldrB    r0, [rDrive, #OD_Drive%]       ; Drive number
  467. *               add     r0, r0, #
  468. ("0")
  469. '               strB    r0, [r1], #1
  470. '               strB    r6, [r1], #1
  471. N               add     r0, rDrive, #OD_FSName%        ; Filing system name
  472. !               bl      strcpy
  473. '               strB    r6, [r1], #1
  474. K               ldr     r0, [rDrive, #OD_OldIcon%]     ; Old icon number
  475. "               mov     r2, #16
  476. 0               swi     "XOS_ConvertInteger2"
  477. /               bVS     wimpSaveDesktop_fail
  478. K               tst     r4, #Flags_Poll%               ; Poll the drive?
  479. &               adrNE   r0, SD_Poll
  480. !               blNE    strcpy
  481. L               tst     r4, #Flags_Click%               ; Poll the drive?
  482. '               adrNE   r0, SD_Click
  483. !               blNE    strcpy
  484. M               tst     r4, #Flags_Directory%          ; Open directories?
  485. +               adrNE   r0, SD_Directory
  486. !               blNE    strcpy
  487. L               tst     r4, #Flags_SprOverload%        ; Explicit Sprite?
  488. (               adrNE   r0, SD_Sprite
  489. !               blNE    strcpy
  490. 6               add     r0, rDrive, #OD_ISprite% +1
  491. !               blNE    strcpy
  492. N               tst     r4, #Flags_Priority%           ; Explicit Priority?
  493. *               adrNE   r0, SD_Priority
  494. !               blNE    strcpy
  495. ]               movNE   r0, #
  496. ("&")                  ; Tell system that it is a Hex number
  497. '               strNEB  r0, [r1], #1
  498. 7               ldrNE   r0, [rDrive, #OD_IPriority%]
  499. ,               swiNE   "XOS_ConvertHex8"
  500. N               movVC   r0, #10                        ; Linefeed character
  501. '               strVCB  r0, [r1], #1
  502. .               addVC   r2, r12, #DT_Space%
  503. W               subVC   r3, r1, r2                     ; Length of generated command
  504. ]               movVC   r0, #2                         ; Write bytes from current position
  505. !               movVC   r1, r5
  506. %               swiVC   "XOS_GBPB"
  507. 6               ldrVC   rDrive, [rDrive, #OD_Next%]
  508.                bVC     loop
  509. .wimpSaveDesktop_fail
  510. K               add     r13, r13, #4                   ; Ignore saved r0
  511. L               mov     r1, #0                         ; We have an error
  512. 7               ldmfd   r13!, {r1 - r6, rDrive, pc}^
  513.                
  514. 0.SD_OFPath     equs    "OverFiler$Path" +bl$
  515. 0.SD_Run        equs    "!Run"           +bl$
  516. 0.SD_OFAdd      equs    "OverFiler_Add " +bl$
  517. 0.SD_Poll       equs    " -Poll"         +bl$
  518. 0.SD_Directory  equs    " -Directory"    +bl$
  519. 0.SD_Sprite     equs    " -Sprite "      +bl$
  520. 0.SD_Priority   equs    " -Priority "    +bl$
  521. 0.SD_Click      equs    " -Click"        +bl$
  522.                ALIGN
  523. ,; Last ditch attempt to find task handle
  524. ; Entry rDrive
  525. -.searchFT_filer equs " Filer" +bl$: align
  526. 8.searchForTask stmfd   r13!, {r0 - r1, r3 - r5, r14}
  527. .               add     r1, r12, #DT_Space%
  528. 2               add     r0, rDrive, #OD_FSName%
  529. !               bl      strcpy
  530. -               adr     r0, searchFT_filer
  531. !               bl      strcpy
  532. !               mov     r0, #0
  533. 2.searchFT0     add     r1, r12, #32 +DT_Space%
  534. "               mov     r2, #16
  535. 8               swi     "XTaskManager_EnumerateTasks"
  536. !               movVS   r2, #0
  537. '               bVS     searchFT_end
  538. !               cmp     r0, #0
  539. !               movLT   r2, #0
  540. '               bLT     searchFT_end
  541. 7               ldr     r2, [r12, #4 +32 +DT_Space%]
  542. .               add     r3, r12, #DT_Space%
  543. '.loop          ldrB    r4, [r2], #1
  544. '               ldrB    r5, [r3], #1
  545. !               teq     r4, r5
  546. $               bNE     searchFT0
  547. "               cmp     r4, #32
  548.                bGE     loop
  549. 7               ldr     r2, [r12, #0 +32 +DT_Space%]
  550.     8.searchFT_end  ldmfd   r13!, {r0 - r1, r3 - r5, pc}^
  551. Z.drive0_err    equd 0: equs "Could not find Filer in charge of this drive" +bl$: align
  552. C.drive1_err    equd 0: equs "No such filing system" +bl$: align
  553. V; This startup a new drive within the WIMP             *rDrive => drive entry , r9
  554. (; Exit r0 *Corrupted*  Vset if error
  555. /.driveStart    stmfd   r13!, {r1 - r8, r14}
  556. .;Get full details of icon we are replacing
  557. .               add     r1, r12, #DT_Space%
  558. K               mvn     r0, #1                         ; Icon bar window
  559. '               str     r0, [r1, #0]
  560. 5               ldr     r0, [rDrive, #OD_OldIcon%]
  561. '               str     r0, [r1, #4]
  562. /               swi     "XWimp_GetIconState"
  563. Q               add     r0, r1, #8                     ; => Start of Icon data
  564. V               ldmia   r0, {r1 - r8}                  ; Load 32 bytes of icon data
  565. 7               add     r0, rDrive, #OD_OldIconData%
  566. f               stmia   r0, {r1 - r8}                  ; Store them so we can recreate icon in full
  567. I; Find task handle of the drive filer we are replacing               
  568. .               add     r1, r12, #DT_Space%
  569. D               mov     r0, #0 : str r0, [r1, #12]     ; your_ref
  570. Z               mov     r0, #19                        ;*r0 == User_Message_Acknowledge
  571.  X               mvn     r2, #1                         ;*r2 == icon bar window handle
  572. !5               ldr     r3, [rDrive, #OD_OldIcon%]
  573. ".               swi     "XWimp_SendMessage"
  574. #*               bVS     driveStart_exit
  575. $5               ldr     r3, [r12, #DT_TaskHandle%]
  576. %!               teq     r3, r2
  577. &e               teqNE   r2, #0                         ; Did a task actually have control of icon?
  578. '2               strNE   r2, [rDrive, #OD_Task%]
  579. (1               orrEQ   r9, r9, #Flags_NoIcon%
  580. )U               mvnNE   r0, #1                         ; == icon bar window handle
  581. *5               ldrNE   r2, [rDrive, #OD_OldIcon%]
  582. +'               stmNEia r1, {r0, r2}
  583. ,-               swiNE   "XWimp_DeleteIcon"
  584. -*               blVS    driveStart_exit
  585. .(               blEQ    searchForTask
  586. /@               strEQ   r2, [rDrive, #OD_Task%]        ; >Yes
  587. 0Z               teqEQ   r2, #0                         ; Has owner task been found yet?
  588. 1d               adrEQ   r0, drive0_err                 ; >No Aarggh just warn user of the problem
  589. 2#               blEQ    retError
  590. 3\; Gets FS number (almost possibly manipulating FSname into correct form, ie add tail FS)
  591. 4_.driveStart1   mov     r0, #13                        ; Check for presence of filing system
  592. 52               add     r1, rDrive, #OD_FSName%
  593. 6X               mov     r2, #0                         ; String termination condition
  594. 7*               swi     "XOS_FSControl"
  595. 8*               bVS     driveStart_exit
  596. 9T               teq     r2, #0                         ; Was filing system found?
  597. :X               adrEQ   r0, drive1_err                 ; >No  So prime for error barf
  598. ;.               swiEQ   "XOS_GenerateError"
  599. <K               bEQ     driveStart_exit                ;      ***Exit***
  600. =6               strNE   r1, [rDrive, #OD_FSNumber%]
  601. >7; get swi numbers for Xfs_MiscOp & Xfs_DescribeDisc
  602. ?0.driveStart2   add     r1, r12, #DT_Space%  
  603. @d               ldr     r2, drive1_swi                 ;*r2 == swiAL proto section of instruction
  604. AR               mov     r0, #
  605. ("X")                  ; Want error returning swi
  606. B'               strB    r0, [r1], #1
  607. C2               add     r0, rDrive, #OD_FSName%
  608. D!               bl      strcpy
  609. Ef               ldrB    r0, [r1, #-2]                  ; Append 'FS' if not already included at end
  610. FD               teq     r0, #
  611. ("F")                  ; of FS name
  612. G(               ldrNEB  r0, [r1, #-1]
  613. H&               teqNE   r0, #
  614. ("S")
  615. I9               movNE r0, #
  616. ("F"): strNEB r0, [r1], #1
  617. J9               movNE r0, #
  618. ("S"): strNEB r0, [r1], #1
  619. Kd               mov     r3, r1                         ;*r3 => start of swi specific name section
  620. ; swi Xfs_DescribeDisc
  621. M(               adr     r0, drive1_DD
  622. N!               bL      strcpy
  623. O.               add     r1, r12, #DT_Space%
  624. P4               swi     "XOS_SWINumberFromString"
  625. Q,               ldrVS   r0, drive1_DDfail
  626. R%               orrVC   r0, r0, r2
  627. S:               str     r0, [rDrive, #OD_DescribeDisc%]
  628. ; swi Xfs_MiscOp
  629. U(               adr     r0, drive1_MO
  630. V!               mov     r1, r3
  631. W!               bL      strcpy
  632. X.               add     r1, r12, #DT_Space%
  633. Y4               swi     "XOS_SWINumberFromString"
  634. Z,               ldrVS   r0, drive1_MOfail
  635. [%               orrVC   r0, r0, r2
  636. \4               str     r0, [rDrive, #OD_MiscOp%]
  637. ^cmov r0, pc: bic r0, r0, #1 << 28: teqP pc, r0         ; Clear Vbit from all our above fiddlings
  638. `&; Calculate width of drives sprite
  639. a%               bL      spriteSize
  640. c.; Replace original drive icon with our own
  641. db               movS    r0, #0                         ; Set EQ - relevant icon deleted already
  642. eQ               bL      iconRebirth                    ; Replace with our icon
  643. fF.driveStart_exit ldmfd  r13!, {r1 - r8, pc}           ; ***Exit***
  644. .drive1_swi    swi 0
  645. i,.drive1_DD     equs "_DescribeDisc" +bl$
  646. j-.drive1_MO     equs "_MiscOp" +bl$: align
  647. k*.drive1_DDfail swi "XOS_GenerateError"
  648. .drive1_MOfail mov r3, #0
  649. n/.wimpError     add     r13, r12, #DT_Stack%
  650. o$               mov     r1, #%011
  651. p'               adr     r2, TaskName
  652. q-               swi     "Wimp_ReportError"
  653. rK               teq     r1, #1                         ; Ok to continue?
  654. s?               bNE     error_cd                       ; >No
  655. t;               ldr     r14, [r12, #DT_WimpPollRoutine%]
  656. u]               teq     r14, #0                        ; Has a wimp_Poll loop been set up?
  657. vP               movNE   pc, r14                        ; >Yes So return to it
  658. wC; Attempt to exist application in the safest way               
  659. x<.error_cd      ldr     r14, [r12, #DT_CloseDownRoutine%]
  660. yp               teq     r14, #0                        ; Has a suitable application exit routine been set up?
  661. zZ               swiEQ   "OS_Exit"                      ; >No  Default system ***Exit***
  662. {N               mov     pc, r14                        ; >Yes Go on to that
  663. }/.retError      stmfd   r13!, {r0 - r2, r14}
  664. ~$               mov     r1, #%011
  665. '               adr     r2, TaskName
  666. -               swi     "Wimp_ReportError"
  667. K               teq     r1, #1                         ; Ok to continue?
  668. Q               ldmEQfd r13!, {r0 - r2, pc}^           ; Ensure Vbit still set
  669. #               b       error_cd
  670. $.initialize    ldr     r0, [r12]
  671. ]               teq     r0, #0                         ; Is this the result of a RMA tidy?
  672. N               movNE   pc, r14                        ; >Yes So ***Exit***
  673. &               stmfd   r13!, {r14}
  674. H               mov     r0, #6                         ; Claim memory
  675. (               mov     r3, #DT_Size%
  676. '               swi     "XOS_Module"
  677. f               strVC   r2, [r12]                      ; Store the reference to our block of memory
  678. `               adrVC   r1, ProtoDT                    ; Initialize critical sections of DaTa
  679. \               ldmVCia r1!, {r0, r3 - r6, r12, r14}   ; Copy DT_TaskHandle - DT_DataLoad
  680. 7               stmVCia r2!, {r0, r3 - r6, r12, r14}
  681. N               ldmVCia r1!,     {r3 - r6}             ; Copy DT_UpdateIcon
  682. -               stmVCia r2!,     {r3 - r6}
  683. h               ldmVCia r1!,     {r3 - r6}             ; DT_InlineSWI% , WimpPollRoutine, ExitRoutine
  684. -               stmVCia r2!,     {r3 - r6}
  685. F               ldmfd   r13!, {pc}                     ; ***Exit***
  686. &; This destroys our nice DT_% defs
  687. G.ProtoDT equd  0: equd 0: equd 0: equd 0: equd -1: equd -1: equd -1
  688. ,         equd -2: equd 0: equd 0: equd 0
  689. 1         equd  0: mov pc, r14: equd 0: equd 0
  690. '.finalize       stmfd   r13!, {r14}
  691. G                ldr     r12, [r12]                    ;*r12 => DaTa
  692. 6                ldr     r0, [r12, #DT_TaskHandle%]
  693. W                teq     r0, #0                        ; Was Wimp_Initialize called?
  694. $                ldrGT   r1, TASK
  695. -                swiGT   "XWimp_CloseDown"
  696. C                movGT   r0, #&1D                      ; UpCallV
  697. .                
  698. adrl("GT", 1, trapupcall)
  699. #                movGT   r2, r12
  700. )                swiGT   "XOS_Release"
  701. 0; reset task handle in case we are restarted
  702. e                mov     r1, #0                        ; Initialize task handle in case we restart
  703. 6                str     r1, [r12, #DT_TaskHandle%]
  704. +; free all our drive entries (if fatal)
  705. ]               teq     r10, #0                        ; Is this a non-fatal finalization?
  706. h               ldmEQfd r13!, {pc}^                    ; >Yes So leave drive entries intact***Exit***
  707. G               mov     r0, #7                         ; Free memory
  708. M               ldr     r2, [r12, #DT_Drives%]         ;*r2 => Drive entry
  709. Y               teq     r2, #0                         ; Are there any drives entries?
  710. h               ldmEQfd  r13!, {pc}^                   ; >No  So ignore                    ***Exit***
  711. G               mov     r4, #0                         ; Reset value
  712. 1               str     r4, [r12, #DT_Drives%]
  713. [.loop          ldr     r3, [r2, #OD_Next%]            ;*r3 => next Drive entry in chain
  714. c               str     r4, [r2, #OD_Next%]            ; Just a precaution incase gone cyclic...
  715. '               swi     "XOS_Module"
  716. !               movS    r2, r3
  717.                bNE     loop
  718. &               ldmfd   r13!, {pc}^
  719. \; Simply removes the icon from the icon bar and sets up Filter to recreate original icon
  720. /.driveRemove   stmfd   r13!, {r1 - r4, r14}
  721. 3               add     r1, r12, #DT_UpdateIcon%
  722. 2               ldr     r0, [rDrive, #OD_Icon%]
  723. '               str     r0, [r1, #4]
  724. -               swi     "XWimp_DeleteIcon"
  725. +               bVS     driveRemove_fail
  726. 2               ldr     r3, [rDrive, #OD_Task%]
  727. R               teq     r3, #0                         ; Does task still exist?
  728. ?               bEQ     driveRemove_fail               ; >No
  729. a               tst     r9, #Flags_NoIcon%             ; Was there originally an icon present?
  730. ?               bNE     driveRemove_fail               ; >No
  731. '; Setup PostFilter to recreate icon
  732. '               adr     r0, TaskName
  733. 1               adr     r1, filterRecreateIcon
  734. %               mov     r2, rDrive
  735. /               ldr     r4, Filter_EventMask
  736. 7               swi     "XFilter_RegisterPostFilter"
  737. +               bVS     driveRemove_fail
  738. Z; Signal PostFilter to do its job (through Message_Quit which Task will never receive)
  739. .               add     r1, r12, #DT_Space%
  740. "               mov     r0, #20
  741. '               str     r0, [r1, #0]
  742. !               mov     r0, #0
  743. (               str     r0, [r1, #12]
  744. (               str     r0, [r1, #16]
  745. !               mov     r2, r3
  746. H               mov     r0, #17                        ; User_Message
  747. .               swi     "XWimp_SendMessage"
  748. e               strVC   r12, [rDrive, #OD_OldIconData% + 32]; Slight fiddle - corrupted on RM_Tidy
  749. b               ldmVCfd r13!, {r1 - r4, pc}            ; Houston we are ready to go! ***Exit***
  750. 1; Signal has failed so ignore icon recreation
  751. '               adr     r0, TaskName
  752. 1               adr     r1, filterRecreateIcon
  753. %               mov     r2, rDrive
  754. 2               ldr     r3, [rDrive, #OD_Task%]
  755. /               ldr     r4, Filter_EventMask
  756. 9               swi     "XFilter_DeRegisterPostFilter"
  757. .driveRemove_fail
  758. ^               orr     r9, r9, #Flags_FinalRemove%    ; Pretend we have recreated old icon
  759. g               mov     r1, #0                         ; Blank out task handle so we dont attempt to
  760. Z               str     r1, [rDrive, #OD_Task%]        ; delete non-existant PostFilter
  761. F               ldmfd   r13!, {r1 - r4, pc}            ; ***Exit***
  762. 0.Filter_EventMask equd %10011111111111111111
  763. ; Entry r12 => Drive entry
  764. .filterRecreateIcon
  765. /               stmfd   r13!, {r2 - r9, r14}
  766. O               ldr     r2, [r1, #16]                  ; Load message action
  767. Q               teq     r2, #0                         ; Is this Message_Quit?
  768. b               ldmNEfd r13!, {r2 - r9, pc}^           ; >No ***Exit*** @Waiting for our signal
  769. 4               add     r0, r12, #OD_OldIconData%
  770. (               ldmia   r0, {r2 - r9}
  771. K               mvn     r0, #4                         ; Icon bar window
  772. ,               stmia   r1, {r0, r2 - r9}
  773. 4               ldr     r0, [r12, #OD_IPriority%]
  774. -               swi     "XWimp_CreateIcon"
  775. 0               ldr     r0, [r12, #OD_Flags%]
  776. [               orr     r0, r0, #Flags_FinalRemove%    ; Mark we have recreated old icon
  777. 0               str     r0, [r12, #OD_Flags%]
  778. ;               ldr     r0, [r12, #OD_OldIconData% + 32]
  779. h               ldr     r2, [r0, #DT_DrivesPending%]   ; Mark that we are waiting to operate on drive
  780. %               add     r2, r2, #1
  781. 7               str     r2, [r0, #DT_DrivesPending%]
  782. G               mvn     r0, #0                         ; Claim event
  783. /               ldmfd   r13!, {r2 - r9, pc}^
  784. D; Remove drive from chain, and remove its icon from the icon bar
  785. Y; Entry r2 => Last drive entry ;r3 => Next drive entry ;rDrive => Current drive entry
  786. .driveFinalRemove
  787. /               stmfd   r13!, {r1 - r4, r14}
  788. Y               teq     r2, #0                         ; Is this the first drive entry
  789. d               strNE   r3, [r2, #OD_Next%]            ; >No  Last drive points to Next drive now
  790. c               strEQ   r3, [r12, #DT_Drives%]         ; >Yes Store next at head of drives chain
  791. I; Deregister PostFilter to recreate original icon (if actually setup)
  792. 2               ldr     r3, [rDrive, #OD_Task%]
  793. !               teq     r3, #0
  794. '               adrNE   r0, TaskName
  795.     1               adrNE   r1, filterRecreateIcon
  796. %               movNE   r2, rDrive
  797. /               ldrNE   r4, Filter_EventMask
  798. 9               swiNE   "XFilter_DeRegisterPostFilter"
  799. &; Free the Drive entry memory used
  800. @               mov     r0, #7                         ; Free
  801. %               mov     r2, rDrive
  802. '               swi     "XOS_Module"
  803. R               mov     rDrive, #0                     ; Register loss of drive
  804. -               ldmfd   r13!, {r1 - 4, pc}
  805. 8; Start up any drives that just happen to be waiting
  806. .processDrivesPending
  807. 7               stmfd   r13!, {r0 - r3, rDrive, r14}
  808. R               ldr     rDrive, [r12, #DT_Drives%]     ;*rDrive =>  Drive entry
  809. R               mov     r2, #0                         ;*r2 => Last Drive entry
  810. Y.loop          teq     rDrive, #0                     ; Do we have a valid drive here
  811. M               bEQ     processDP1                     ; >No  Jump to Exit
  812. R               ldr     r3, [rDrive, #OD_Next%]        ;*r3 => Next Drive entry
  813. 3               ldr     r9, [rDrive, #OD_Flags%]
  814. ,               tst     r9, #Flags_Added%
  815. %               blNE    driveStart
  816. #               blVS    retError
  817.  h               orrVS   r9, r9, #Flags_Removed%        ; If error while starting then Remove Now!!!!!
  818. !.               tst     r9, #Flags_Removed%
  819. "&               blNE    driveRemove
  820. ##               blVS    retError
  821. $2               tst     r9, #Flags_FinalRemove%
  822. %+               blNE    driveFinalRemove
  823. &#               blVS    retError
  824. 'A               bic     r9, r9, #Flags_Added% + Flags_Removed%
  825. (Y               teq     rDrive, #0                     ; Does drive entry still exist?
  826. )Y               strNE   r9, [rDrive, #OD_Flags%]       ; >Yes Store new state of Flags
  827. *%               mov     r2, rDrive
  828. +%               mov     rDrive, r3
  829. ,F               b       loop                           ; Process it
  830. -!.processDP1    mov     r0, #0
  831. .8               str     r0, [r12, #DT_DrivesPending%]
  832. /7               ldmfd   r13!, {r0 - r3, rDrive, pc}^
  833. 13.TaskName      equs    "Over Filer" +bl$: align
  834. 24.PollMask      equd    %110010000001100100110010
  835. 3!.TASK          equs    "TASK"
  836. 4d.Messages      equd 1: equd 3: equd &407: equd &502: equd &503: equd &400C1: equd &400c3: equd 0
  837. 6G.start         ldr     r12, [r12]                     ; r12 => DaTa
  838. 7H               add     r13, r12, #DT_Stack%           ; Set up stack
  839. 9$; Tell the WIMP manager about us
  840. :].start0        mov     r0, #256                       ; == 310  Minimum WIMP version 3.10
  841. ;-               add     r0, r0, #310 - 256
  842. <#               ldr     r1, TASK
  843. ='               adr     r2, TaskName
  844. >'               adr     r3, Messages
  845. ?,               swi     "Wimp_Initialise"
  846. @5               str     r1, [r12, #DT_TaskHandle%]
  847. AW; Want to trap if a filing medium is not present/known or we might miss a disc swap
  848. BC.start1        mov     r0, #&1D                       ; UpCallV
  849. C)               adr     r1, trapupcall
  850. D"               mov     r2, r12
  851. E&               swi     "XOS_Claim"
  852. FN; We can now set up a suitable place to retreat to in the case of an error
  853. G(               adr     r0, closeDown
  854. H;               str     r0, [r12, #DT_CloseDownRoutine%]
  855. ; Initialize XEigfactor
  856. JH               mvn     r0, #0                         ; Current mode
  857. KF               mov     r1, #4                         ; XEigfactor
  858. L1               swi     "XOS_ReadModeVariable"
  859. M5               str     r2, [r12, #DT_XEigfactor%]
  860. N7; Initialize any drive entries that have been setup
  861. O/               bl      processDrivesPending
  862. PC; Can now set suitable place to continue processing after error
  863. Q'               adr     r0, wimpPoll
  864. R:               str     r0, [r12, #DT_WimpPollRoutine%]
  865. S@; Set initial values for any pre-loaded icons               
  866. Ta               b       testAllDrives                  ; Insert drive names, etc straight away
  867. V^.wimpPoll      adr     r14, wimpPoll                  ; Set up return address just in case
  868. W2               swi     "XOS_ReadMonotonicTime"
  869. X+               addVC   r2, r0, #Update%
  870. Y'               ldrVC   r0, PollMask
  871. Z.               addVC   r1, r12, #DT_Space%
  872. [6               addVC   r3, r12, #DT_DrivesPending%
  873. \+               swiVC   "XWimp_PollIdle"
  874. ]$               bVS     wimpError
  875. _L               teq     r0, #0                         ; Null_Reason_Code
  876. `(               bEQ     testAllDrives
  877. bL               teq     r0, #13                        ; PollWord_NonZero
  878. c/               bEQ     processDrivesPending
  879. eH               teq     r0, #17                        ; User_Message
  880. fQ               teqNE   r0, #18                        ; User_Message_Recorded
  881. g)               bEQ     receiveMessage
  882. iG               teq     r0, #6                         ; Mouse_Click
  883. j%               bEQ     mouseclick
  884. lY               b       wimpPoll                       ; Nothing that interested us...
  885. oH; See's if any of the drives under our control have changed in state
  886. pZ.testAllDrives ldr     rDrive, [r12, #DT_Drives%]     ;*rDrive => First drive in chain
  887. qb.loop          teq     rDrive, #0                     ; Have we reached the end of the drives?
  888. rg               bEQ     wimpPoll                       ; >Yes ***Exit*** @Reached end of drive chain
  889. sH               ldr     r9, [rDrive, #OD_Flags%]       ;*r9  == Flags
  890. t_               tst     r9, #Flags_Poll% + Flags_FullProcess%; Should this drive be checked?
  891. uL               blNE    testDrive                      ; >Yes So check it
  892. vW               strNE   r9, [rDrive, #OD_Flags%]       ;      Store new set of flags
  893. wQ               ldr     rDrive, [rDrive, #OD_Next%]    ; Advance to next drive
  894. xK               b       loop                           ;      Process it
  895. {/.testDrive     stmfd   r13!, {r0 - r8, r14}
  896. ; Has drive poll changed?
  897. }H.testDrive1    mov     r0, #1                         ; Poll changed
  898. ~4               ldr     r1, [rDrive, #OD_MiscOp%]
  899. 4               str     r1, [r12, #DT_InlineSWI%]
  900. 3               ldr     r1, [rDrive, #OD_Drive%]
  901. 6               ldr     r2, [rDrive, #OD_Sequence%]
  902. -               adr     r14, testDrive1swi
  903. R               add     pc, r12, #DT_InlineSWI%        ; bl to SWI "Xfs_MiscOp"
  904. S.testDrive1swi movVS   r3, #0                         ; Pretend to get a result
  905. 6               orrVS   r9, r9, #Flags_DiscCorrupt%
  906. 6               bicVC   r9, r9, #Flags_DiscCorrupt%
  907. a               str     r2, [rDrive, #OD_Sequence%]    ; Store for next MiscOp with this drive
  908. h               mov     r3, r3, LSL #5 ;WARN WARN WARN uses absolute positions of bit@@@@@@@@@@@@@@@@
  909. 0               and     r3, r3, #Flags_Empty%
  910. %               eor     r0, r9, r3
  911. 0               bic     r9, r9, #Flags_Empty%
  912. %               orr     r9, r9, r3
  913. R               tst     r9, #Flags_FullProcess%        ; Completly update icon?
  914. 6               bic     r9, r9, #Flags_FullProcess%
  915. @               bNE     testDrive2                     ; >Yes
  916. T               tst     r0, #Flags_Empty%              ; Has drive state changed?
  917. K               ldmEQfd r13!, {r0 - r8, pc}^           ; >Yes ***Exit***
  918. 5; Make icon name/sprite details reflect new state
  919. G.testDrive2    add     r0, rDrive, #OD_IName%         ;*r0 => IName
  920. &               mov     r1, #
  921. (":")
  922. 3               ldr     r2, [rDrive, #OD_Drive%]
  923. X               add     r2, r2, #
  924. ("0")              ; FileCore limits to < 10 drives
  925. B               orr     r1, r1, r2, LSL #8             ; ";n00"
  926. #               str     r1, [r0]
  927. ,               tst     r9, #Flags_Empty%
  928. b               movNE   r2, #
  929. ("o")                  ; >Yes Disk out of drive - sprite end char
  930. U               bNE     testDrive2_0                   ;      Jump to next section
  931. ;; There is a disc in the drive so try and find its name
  932. :               ldr     r1, [rDrive, #OD_DescribeDisc%]
  933. 4               str     r1, [r12, #DT_InlineSWI%]
  934. c               swi     "XHourglass_On"                ; DescribeDisc can take a noticeable time
  935. f               sub     r1, r13, #64 +4                ; Assume temp space on stack for disk record
  936. -               adr     r14, testDrive2swi
  937. T               add     pc, r12, #DT_InlineSWI%        ; bl to "Xfs_DescribeDisc"
  938. a.testDrive2swi movVS   r8, #1                         ;*r8 Indicate if there was a disc error
  939. !               movVC   r8, #0
  940. f               addVC   r1, r1, #22                    ;*r1 => Discname (with space & poss. no end)
  941. (               adrVS   r1, DiskError
  942. [               addVS   r0, rDrive, #OD_IName%         ; r0 was overwritten by swi error
  943. ]               mov     r2, #10                        ; Discname up to 10 characters long
  944. '.loop          ldrB    r3, [r1], #1
  945. f               cmp     r3, #
  946. (" ")                  ; Check for character terminater (incld SPACE)
  947. !               movLE   r3, #0
  948. '               strB    r3, [r0], #1
  949. %               subS    r2, r2, #1
  950.                bGT     loop
  951. ^               mov     r3, #0                         ; Properly terminate it if it wasn't
  952. #               strB    r3, [r0]
  953. T               tst     r9, #Flags_ModeSame%           ; Was there a mode change?
  954. Q               teqNE   r8, #1                         ; >No  Was the disc ok?
  955. f               tstNE   r9, #Flags_Directory%          ;      >Yes Does user want us to open filer?
  956. ]               blNE    filerOpen                      ;           >Yes Open filer on disc
  957. +               swi     "XHourglass_Off"
  958. a               mov     r2, #
  959. ("i")                  ; Disc in drive - end of sprite character
  960. O; Set sprite name                                      *r2 == end character
  961. T.testDrive2_0  tst     r9, #Flags_ModeSame%           ; Was there a mode change?
  962. O               orrEQ   r9, r9, #Flags_ModeSame%       ; >Yes So reset flags
  963. 1               tst     r9, #Flags_SprCorrupt%
  964. %               bNE     testDrive3
  965. 3               add     r0, rDrive, #OD_ISprite%
  966. \.loop          ldrB    r1, [r0], #1                   ;.Find end of current Sprite name 
  967. &               cmp     r1, #
  968. (" ")
  969.                bGE     loop
  970. (               strB    r2, [r0, #-2]
  971. 3; Change icon in WIMPs eye to reflect new state
  972. 1.testDrive3    add     r0, rDrive, #OD_IName%
  973. O               mov     r2, #0                         ;*r2 == width of text
  974. U.loop          ldrB    r1, [r0], #1                   ;.Count length of disc name
  975. "               cmp     r1, #32
  976. %               addGE   r2, r2, #1
  977.                bGE     loop
  978. Y               mov     r2, r2, ASL #4                 ; width in external coordinates
  979. 4               ldr     r3, [rDrive, #OD_SWidth%]
  980. d               cmp     r2, r3                         ; Must be at least width enough for sprite
  981. !               movLE   r2, r3
  982. 4               ldr     r0, [rDrive, #OD_IWidth%]
  983. N               teq     r0, r2                         ; Has width changed?
  984. U               strNE   r2, [rDrive, #OD_IWidth%]      ; >Yes Store new width then
  985. \               blNE    iconRebirth                    ;      Delete & then reCreate icon
  986. /               ldmNEfd r13!, {r0 - r8, pc}^
  987. 9; Icon has same dimensions so just redraw screen form
  988. S               add     r1, r12, #DT_UpdateIcon%       ; No change to icon flags
  989. 2               ldr     r3, [rDrive, #OD_Icon%]
  990. '               str     r3, [r1, #4]
  991. /               swi     "XWimp_SetIconState"
  992. #               blVS    retError
  993. /               ldmfd   r13!, {r0 - r8, pc}^
  994. U; Deletes a drives icon then recreates                *rDrive => this drive entry
  995. !; Entry  NE delete icon first
  996. /.iconRebirth   stmfd   r13!, {r0 - r7, r14}
  997. Z               sub     r1, r13, #36 +4                ; Assume a bit of space on stack
  998. U               mvnNE   r0, #1                         ; == icon bar window handle
  999. 2               ldrNE   r2, [rDrive, #OD_Icon%]
  1000. '               stmNEia r1, {r0, r2}
  1001. -               swiNE   "XWimp_DeleteIcon"
  1002. .               adr     r2, ProtoCreateIcon
  1003. g               ldmia   r2, {r2 - r7}                  ; r2 == window; r3..r6 == coords; r7 == flags
  1004. 4               ldr     r5, [rDrive, #OD_IWidth%]
  1005. (               stmia   r1, {r2 - r7}
  1006. )               add     r0, r1, #20 +4
  1007. O               add     r2, rDrive, #OD_IName%         ; => Icon text buffer
  1008. U               add     r3, rDrive, #OD_ISprite%       ; => Icon validation buffer
  1009. L               mov     r4, #12                        ; == buffer length
  1010. +               stmia   r0, {r2, r3, r4}
  1011. 7               ldr     r0, [rDrive, #OD_IPriority%]
  1012. -               swi     "XWimp_CreateIcon"
  1013. #               blVS    retError
  1014. 2               strVC   r0, [rDrive, #OD_Icon%]
  1015. /               ldmfd   r13!, {r0 - r7, pc}^
  1016. h; Trap if there is a request for a media change. If there is a change then we won't catch the change
  1017. M.trapupcall    teq     r0, #1                         ; Media not present
  1018. K               teqNE   r0, #2                         ; Media not known
  1019. "               movNES  pc, r14
  1020. /               stmfd   r13!, {r5 - r6, r14}
  1021. U               ldr     r5, [r12, #DT_Drives%]         ;*r5 => Current drive entry
  1022. X.loop          teq     r5, #0                         ; Is this a valid drive entry?
  1023. c               ldmEQfd r13!, {r5 - r6, pc}^           ; >No ***Exit*** @Dont control this drive
  1024. K               ldr     r6, [r5, #OD_FSNumber%]        ; Same FS number?
  1025. !               teq     r6, r1
  1026. &               bNE     trapupcall0
  1027. !               cmn     r3, #1
  1028. K               ldrNE   r6, [r5, #OD_Drive%]           ; And same drive?
  1029. !               teqNE   r6, r3
  1030. V.trapupcall0   ldrNE   r5, [r5, #OD_Next%]            ; >No  Load next drive entry
  1031. K               bNE     loop                           ;      Process it
  1032. /               ldr     r6, [r5, #OD_Flags%]
  1033. e               orr     r6, r6, #Flags_FullProcess%    ; Reprocess this drive as disc might change
  1034. /               str     r6, [r5, #OD_Flags%]
  1035. F               ldmfd   r13!, {r5 - r6, pc}^           ; ***Exit***
  1036. Y.helpRequest   ldr     rDrive, [r12, #DT_Drives%]     ;*rDrive => Current Drive entry
  1037. M               ldr     r3, [r1, #36]                  ;*r3 == icon handle
  1038. X.loop          teq     rDrive, #0                     ; Is this still a drive entry?
  1039. c               bEQ     wimpPoll                       ; >No  ***Exit*** @Shouldnt have happened
  1040. 2               ldr     r0, [rDrive, #OD_Icon%]
  1041. Z               teq     r0, r3                         ; Help requested from this icon?
  1042. \               ldrNE   rDrive, [rDrive, #OD_Next%]    ; >No  Advance to next drive entry
  1043. K               bNE     loop                           ;      Process it
  1044. W               ldr     r3, [rDrive, #OD_Task%]        ;*r3 == real icon task handle
  1045. g               teq     r3, #0                         ; Does the real owner has a valid task handle
  1046. K               bEQ     wimpPoll                       ; >No  ***Exit***
  1047. %; Acknowledge Message_HelpRequest
  1048. '               ldr     r0, [r1, #8]
  1049. M               str     r0, [r1, #12]                  ; your_ref = my_ref
  1050. T               mov     r0, #19                        ; User_Message_Acknowledge
  1051. P               ldr     r2, [r1, #4]                   ; Reply to task handle
  1052. e               str     r2, [r12, #DT_HelpTask%]       ; Remember task for later helpReply message
  1053. .               swi     "XWimp_SendMessage"
  1054. 8; Now send Message_HelpRequest to real owner of icon
  1055. 5               ldrVC   r0, [rDrive, #OD_OldIcon%]
  1056. (               strVC   r0, [r1, #36]
  1057. H               movVC   r0, #17                        ; User_Message
  1058.  !               movVC   r2, r3
  1059. !h               swiVC   "XWimp_SendMessage"            ; >Yes So pass on HelpRequest to real receiver
  1060. "#               bVC     wimpPoll
  1061. #$               bVS     wimpError
  1062. %H.helpReply     mov     r0, #17                        ; User_Message
  1063. &3               ldr     r2, [r12, #DT_HelpTask%]
  1064. 'Z               teq     r2, #0                         ; Is HelpTask a real task handle
  1065. (Z               swiNE   "XWimp_SendMessage"            ; >Yes So send Message_HelpReply
  1066. )#               bVC     wimpPoll
  1067. *$               bVS     wimpError
  1068. .receiveMessage
  1069. -J               ldr     r2, [r1, #16]                  ; Message number
  1070. .Q               mov r3, #&500  : add r4, r3, #2  : teq r2, r4: bEQ helpRequest
  1071. /O                                add r4, r3, #3  : teq r2, r4: bEQ helpReply
  1072. 1T               mov r3, #&400  : add r4, r3, #7  : teq r2, r4: bEQ filerSelection
  1073. 3N                                                  teq r2, #3: bEQ dataLoad
  1074. 4N                                                  teq r2, #1: bEQ dataSave
  1075. 6P               mov r3, #&40000: add r4, r3, #&C1: teq r2, r4: bEQ modeChange
  1076. 7T                                add r4, r3, #&C3: teq r2, r4: bEQ checkCloseDown
  1077. 9@               teq     r2, #0                         ; Quit
  1078. :#               bNE     wimpPoll
  1079. ;:                                                      
  1080. <C.closeDown     mov     r0, #&1D                       ; UpCallV
  1081. =)               adr     r1, trapupcall
  1082. >"               mov     r2, r12
  1083. ?(               swi     "XOS_Release"
  1084. A)               adr     r1, closeDown3
  1085. B;               str     r1, [r12, #DT_CloseDownRoutine%]
  1086. C)               adr     r1, closeDown1
  1087. D:               str     r1, [r12, #DT_WimpPollRoutine%]
  1088. E#               blVS    retError
  1089. G?; Set Flags_Remove% for each drive to get them to shut down
  1090. H5               ldr     rDrive, [r12, #DT_Drives%]
  1091. I%.loop          teq     rDrive, #0
  1092. J%               bEQ     closeDown0
  1093. K3               ldr     r9, [rDrive, #OD_Flags%]
  1094. L2               tst     r9, #Flags_FinalRemove%
  1095. M2               orrEQ   r9, r9, #Flags_Removed%
  1096. N3               strEQ   r9, [rDrive, #OD_Flags%]
  1097. O6               ldr     rDrive, [rDrive, #OD_Next%]
  1098.                b       loop
  1099. Q/.closeDown0    bl      processDrivesPending
  1100. S,; Give chance to recreate original icons
  1101. T5.closeDown1    ldr     rDrive, [r12, #DT_Drives%]
  1102. U%               teq     rDrive, #0
  1103. V%               bEQ     closeDown3
  1104. W`               adr     r14, closeDown1                  ; Set up return address just in case
  1105. X'               ldr     r0, PollMask
  1106. YI               orr     r0, r0, #1                     ; Mask out Null
  1107. Z.               add     r1, r12, #DT_Space%
  1108. [6               add     r3, r12, #DT_DrivesPending%
  1109. \'               swi     "XWimp_Poll"
  1110. ]$               bVS     wimpError
  1111. _L               teq     r0, #13                        ; PollWord_NonZero
  1112. `/               bEQ     processDrivesPending
  1113. bH               teq     r0, #17                        ; User_Message
  1114. cQ               teqNE   r0, #18                        ; User_Message_Recorded
  1115. d(               ldrEQ   r2, [r1, #16]
  1116. eH               teqEQ   r2, #0                         ; Message_Quit
  1117. f%               bNE     closeDown1
  1118. ; Now finally Exit
  1119. i5.closeDown3    ldr     r0, [r12, #DT_TaskHandle%]
  1120. j#               ldr     r1, TASK
  1121. k,               swi     "XWimp_CloseDown"
  1122. l!               mov     r0, #0
  1123. m5               str     r0, [r12, #DT_TaskHandle%]
  1124. n,; Delete our module for testing purposes
  1125. o-               
  1126. adrl(" ", 3, titleString)
  1127. p*               swi     "OS_ExitAndDie"
  1128. sP.ProtoCreateIcon equd -5: equd 0: equd -16: equd -1: equd 60: equd &1700212B
  1129. uh; Used if Vset on swi DescribeDisc, assume disc itself is corrupted. '*' is illegal disc name char!!
  1130. v0.DiskError      equs "*Corrupt*" +bl$: align
  1131. x*; Redirect mouseclick to original task
  1132. y&.mouseclick    add     r0, r1, #12
  1133. zU               ldmia   r0, {r0, r2}                   ;*r0 == window ;*r2 == icon
  1134. {X               cmn     r0, #2                         ; Is this the icon bar window?
  1135. |d               bNE     wimpPoll                       ; >No  ***Exit*** Should not have received
  1136. }Q               ldr     rDrive, [r12, #DT_Drives%]     ;*rDrive => Drive entry
  1137. ~S.loop          teq     rDrive, #0                      ; Is this a valid entry?
  1138. _               bEQ     wimpPoll                       ; >No  ***Exit*** Failed to find icon
  1139. 2               ldr     r0, [rDrive, #OD_Icon%]
  1140. Y               teq     r0, r2                         ; Is this for the correct icon?
  1141. [               ldrNE   rDrive, [rDrive, #OD_Next%]    ; >No  Advance to next drive enty
  1142. K               bNE     loop                           ;      Process it
  1143. <; If drive has -Click on then set to update icon display
  1144. 3               ldr     r9, [rDrive, #OD_Flags%]
  1145. P               tst     r9, #Flags_Click%              ; Is -Click switch on?
  1146. R               orrNE   r9, r9, #Flags_FullProcess%    ; >Yes Update drive icon
  1147. 3               strNE   r9, [rDrive, #OD_Flags%]
  1148. (; Send message to original task/icon
  1149. 5               ldr     r0, [rDrive, #OD_OldIcon%]
  1150. (               str     r0, [r1, #16]
  1151. G               mov     r0, #6                         ; Mouse_Click
  1152. 2               ldr     r2, [rDrive, #OD_Task%]
  1153. Y               teq     r2, #0                         ; Is there a valid task handle?
  1154. d               swiNE   "XWimp_SendMessage"            ; >Yes So inform real owners of mouseclick
  1155. #               bVC     wimpPoll
  1156. $               bVS     wimpError
  1157. V.dataSave      ldr     r3, [r1, #24]                  ;*r3 == icon bar icon handle
  1158. 5               ldr     rDrive, [r12, #DT_Drives%]
  1159. %.loop          teq     rDrive, #0
  1160. #               bEQ     wimpPoll
  1161. 2               ldr     r0, [rDrive, #OD_Icon%]
  1162. !               teq     r0, r3
  1163. 6               ldrNE   rDrive, [rDrive, #OD_Next%]
  1164.                bNE     loop
  1165. 3               ldr     r9, [rDrive, #OD_Flags%]
  1166. ,               tst     r9, #Flags_Click%
  1167. 5               orrNE   r9, r9,#Flags_FullProcess%
  1168. $               blNE    testDrive
  1169. 3               strNE   r9, [rDrive, #OD_Flags%]
  1170. A               tst     r9, #Flags_DiscCorrupt% + Flags_Empty%
  1171. W               swiNE   XOS_WriteI + 7                ; >Yes Little feedback to user
  1172. $               bVS     wimpError
  1173. e               bNE     wimpPoll                      ;      ***Exit*** @Can't save to empty drive
  1174. 3               add     r0, r12, #44  +DT_Space%
  1175. 3               add     r1, r12, #192 +DT_Space%
  1176. !               bL      strcpy
  1177. 3               add     r1, r12, #44  +DT_Space%
  1178. (               bL      drivePathname
  1179. &               mov     r0, #
  1180. (".")
  1181. (               strB    r0, [r1, #-1]
  1182. 3               add     r0, r12, #192 +DT_Space%
  1183. !               bL      strcpy
  1184. .               add     r0, r12, #DT_Space%
  1185. J               sub     r1, r1, r0                     ; Message length
  1186. X               add     r1, r1, #3                     ; Align message length to word
  1187. %               bic     r1, r1, #3
  1188. R               str     r1, [r12, #0 +DT_Space%]       ; Store new message size
  1189. !               mov     r1, r0
  1190. '               ldr     r0, [r1, #8]
  1191. M               str     r0, [r1, #12]                  ; your_ref = my_ref
  1192. O               mov     r0, #2                         ; Message_DataSaveAck
  1193. (               str     r0, [r1, #16]
  1194. H               mov     r0, #17                        ; User_Message
  1195. X               ldr     r2, [r1, #4]                   ; Return it to original sender
  1196. .               swi     "XWimp_SendMessage"
  1197. f               mvnVC   r0, #1                         ; Mark a DataSave for future DataLoad mesage
  1198. 3               strVC   r0, [r12, #DT_DataLoad%]
  1199. #               bVC     wimpPoll
  1200. $               bVS     wimpError
  1201. Q; Used by filer to inform us of the number of files it is going to give to us
  1202. P.filerSelection ldr    r0, [r1, #56]: str r0, [r12, #DT_FilerSelect_Column%]
  1203. M               ldr     r0, [r1, #60]: str r0, [r12, #DT_FilerSelect_Row%]
  1204. c               mov     r0, #0       : str r0, [r12, #DT_DataLoad%]; Start of selection DataLoad
  1205. #               b       wimpPoll
  1206. :.FilerAction_Start equs    "Filer_Action" + bl$: align
  1207. O.dataLoad      ldr     r6, [r12, #DT_DataLoad%]       ;*r6 == present state
  1208. R               cmn     r6, #2                         ; Did DataSave preceeded
  1209. V               bEQ     dataload_ack                   ; >Yes Simply acknowledge it
  1210. (; find drive which received dataLoad
  1211. S               ldr     r2, [r1, #24]                  ; Destination icon handle
  1212. Y               ldr     rDrive, [r12, #DT_Drives%]     ;*rDrive => Current drive entry
  1213. b.loop          teq     rDrive, #0                     ; Have we reached the end of our drives?
  1214. h               bEQ     wimpPoll                       ; >Yes ***Exit*** @Should not have been inform
  1215. 2               ldr     r0, [rDrive, #OD_Icon%]
  1216. Y               teq     r0, r2                         ; DataLoad for this drive icon?
  1217. _               ldrNE   rDrive, [rDrive, #OD_Next%]    ; >No  So advance to next drive entry
  1218. K               bNE     loop                           ;      Process it
  1219. ; Test state of drive
  1220. 3               ldr     r9, [rDrive, #OD_Flags%]
  1221. ,               tst     r9, #Flags_Click%
  1222. 6               orrNE   r9, r9, #Flags_FullProcess%
  1223. $               blNE    testDrive
  1224. 3               strNE   r9, [rDrive, #OD_Flags%]
  1225. A               tst     r9, #Flags_DiscCorrupt% + Flags_Empty%
  1226. \               swiNE   XOS_WriteI + 7                 ; >Yes Give a little user feedback
  1227. $               bVS     wimpError
  1228. f               bNE     wimpPoll                       ;      ***Exit*** @Can't save to empty drive
  1229. R               cmp     r6, #0                         ; Test state of transfer
  1230. d               adrLE   r0, FilerAction_Start          ; >First Have to load up a new FilerAction
  1231. ,               swiLE   "XWimp_StartTask"
  1232. $               bVS     wimpError
  1233. W               strLE   r0, [r12, #DT_FilerAction_Task%];       Remember task handle
  1234. e               addGE   r2, r6, #1                     ; >Filer Record that the next file has been
  1235. L               strGE   r2, [r12, #DT_DataLoad%]       ;        processed
  1236. E               ldrGT   r0, [r12, #DT_FilerAction_Task%];>NotFirst
  1237. $               bGT     dataLoad1
  1238. R; Check to see if Shift key is pressed, if so then move rather than copy files
  1239. )               mov r3, r0: mov r4, r1
  1240. W               mov r0, #202: mov r1, #0:mov r2, #255: swi "XOS_Byte": blVS retError
  1241. d               tst r1, #%1000:movEQ r1, #0: movNE r1, #6: str r1, [r12, #DT_FilerAction_Reason%]
  1242. )               mov r0, r3: mov r1, r4
  1243. :                                                      
  1244. R.dataLoad1     add     r1, r1, #44                    ;*r1 => pathname of file
  1245. !               mov     r2, r1
  1246. Q.loop          ldrB    r3, [r2], #1                   ;.Go to end of pathname
  1247. &               cmp     r3, #
  1248. (" ")
  1249.                bGE     loop
  1250. M               mov     r8, r2                         ;*r8 => message end
  1251. h.loop          ldrB    r3, [r2, #-1]!                 ;.RSearch for first directory separator marker
  1252. &               teq     r3, #
  1253. (".")
  1254.                bNE     loop
  1255. !               mov     r3, #0
  1256. [               strB    r3, [r2], #1                   ; Terminate path just before leaf
  1257. ^               cmp     r6, #0                         ; Is this the first file to process?
  1258. _               swiLE   "XFilerAction_SendSelectedDirectory"; >Yes So have to send directory
  1259. I               movVC   r1, r2                         ; Send the leaf
  1260. :               swiVC   "XFilerAction_SendSelectedFile"
  1261. $               bVS     wimpError
  1262. .; Read the current filer options from CMOS
  1263. !               mov     r3, r0
  1264. X               mov     r0, #161                       ; read battery-backed CMOS RAM
  1265. I               mov     r1, #198                       ; Desktop state
  1266. %               swi     "XOS_Byte"
  1267. #               blVS    retError
  1268.     !               mov     r0, #0
  1269. C               tst     r2, #1 << 6                    ; Verbose
  1270. *               orrNE   r0, r0, #%00001
  1271. C               tst     r2, #1 << 5                    ; Conform
  1272. *               orrNE   r0, r0, #%00010
  1273. A               tst     r2, #1 << 4                    ; Force
  1274. *               orrNE   r0, r0, #%00100
  1275. A               tst     r2, #1 << 7                    ; Newer
  1276. *               orrNE   r0, r0, #%01000
  1277. C               mov     r2, r0                         ; Options
  1278. !               mov     r0, r3
  1279. 3               add     r1, r12, #192 +DT_Space%
  1280. (               bL      drivePathname
  1281. 3               add     r3, r12, #192 +DT_Space%
  1282. [               sub     r4, r1, r3                     ; Length of destination directory
  1283. T               ldr     r1, [r12, #DT_FilerAction_Reason%]; Operation reason code
  1284. R               cmp     r6, #0                         ; Is this a one off file
  1285. ]               bMI     dataLoad2                      ; >Yes So ignore test for moe files
  1286. O; Check column/row range to see if Filer will send us more files to process
  1287. _               add     r8, r8, #3                     ; Set message length to multiple of 4
  1288. %               bic     r8, r8, #3
  1289.  a               ldr     r5, [r12, #DT_FilerSelect_Column%]; Maximum column of files to process
  1290. !V               ldr     r7, [r8], #4                   ; Load current column number
  1291. "T               cmp     r7, r5                         ; At the limit of columns?
  1292. #\               ldrGE   r5, [r12, #DT_FilerSelect_Row%]; >Yes Max row of files to process
  1293. $#               ldrGE   r7, [r8]
  1294. %!               cmpGE   r7, r5
  1295. &b               bLT     wimpPoll                       ; Still more files to come so ***Exit***
  1296. '<.dataLoad2     swi     "XFilerAction_SendStartOperation"
  1297. ($               bVS     wimpError
  1298. *,; Acknowledge that we have loaded a file
  1299. +Q.dataload_ack  mvn     r5, #0                         ; Re-initialize markers
  1300. ,=               str     r5, [r12, #DT_FilerSelect_Column%]
  1301. -:               str     r5, [r12, #DT_FilerSelect_Row%]
  1302. .I               str     r5, [r12, #DT_DataLoad%]        ; No selection
  1303. 0H               mov     r0, #17                        ; User_Message
  1304. 1.               add     r1, r12, #DT_Space%
  1305. 2'               ldr     r2, [r1, #8]
  1306. 3L               str     r2, [r1, #12]                  ; you_ref = my_ref
  1307. 4O               mov     r2, #4                         ; Message_DataLoadAck
  1308. 5(               str     r2, [r1, #16]
  1309. 6'               ldr     r2, [r1, #4]
  1310. 7.               swi     "XWimp_SendMessage"
  1311. 8#               bVC     wimpPoll
  1312. 9$               bVS     wimpError
  1313. <O; Attempts to open a drives directory display          *rDrive => OverBlock
  1314. =/.filerOpen     stmfd   r13!, {r0 - r2, r14}
  1315. >.               add     r1, r12, #DT_Space%
  1316. ?!               mov     r0, #0
  1317. @G               str     r0, [r1, #12]                  ; == your_ref
  1318. A@               str     r0, [r1, #24]                  ; bits
  1319. BP               mov     r0, #&400                      ; Message_FilerOpenDir
  1320. C(               str     r0, [r1, #16]
  1321. D6               ldr     r0, [rDrive, #OD_FSNumber%]
  1322. E(               str     r0, [r1, #20]
  1323. FO               add     r1, r1, #28                    ;*r1 => direcory name
  1324. G(               bL      drivePathname
  1325. H.               add     r0, r12, #DT_Space%
  1326. I%               sub     r1, r1, r0
  1327. J%               add     r1, r1, #3
  1328. K%               bic     r1, r1, #3
  1329. L'               str     r1, [r0, #0]
  1330. M!               mov     r1, r0
  1331. N"               mov     r0, #17
  1332. OR               mov     r2, #0                         ; Broadcast to all tasks
  1333. P.               swi     "XWimp_SendMessage"
  1334. Q#               blVS    retError
  1335. R/               ldmfd   r13!, {r0 - r2, pc}^
  1336. UH.modeChange    mvn     r0, #0                         ; Current mode
  1337. VF               mov     r1, #4                         ; XEigfactor
  1338. W1               swi     "XOS_ReadModeVariable"
  1339. X$               bVS     wimpError
  1340. Y5               ldr     r0, [r12, #DT_XEigfactor%]
  1341. Zh               teq     r0, r2                         ; Has the XEigfactor changed over mode change?
  1342. [^               bEQ     wimpPoll                       ; >No ***Exit*** No action necessary
  1343. \5               str     r2, [r12, #DT_XEigfactor%]
  1344. ]5               ldr     rDrive, [r12, #DT_Drives%]
  1345. ^%.loop          teq     rDrive, #0
  1346. _#               bEQ     wimpPoll
  1347. `3               ldr     r9, [rDrive, #OD_Flags%]
  1348. a6               orr     r9, r9, #Flags_FullProcess%
  1349. b_               bic     r9, r9, #Flags_ModeSame%       ; Mark that we have just changed mode
  1350. c[               bl      spriteSize                     ; New size of sprite in this mode
  1351. dX               str     r9, [rDrive, #OD_Flags%]       ; Store new set of drive flags
  1352. e[               ldr     rDrive, [rDrive, #OD_Next%]    ; Advance to the next drive entry
  1353. fF               b       loop                           ; Process it
  1354. iL; Checks to see if one of the tasks we are interested in has closed down
  1355. j\.checkCloseDown ldr    r0, [r1, #4]                   ;*r0 == task which has closed down
  1356. kY                ldr    rDrive, [r12, #DT_Drives%]     ;*rDrive => Current drive entry
  1357. lR                mov    r2, #0                         ;*r2 == null task handle
  1358. mV.loop           teq    rDrive, #0                     ; Are there any drives left?
  1359. nK                bEQ    wimpPoll                       ; >No  ***Exit***
  1360. o2                ldr    r1, [rDrive, #OD_Task%]
  1361. pV                teq    r0, r1                         ; Is this task closing down?
  1362. qQ                strEQ  r2, [rDrive, #OD_Task%]        ; >Yes So mark it as so
  1363. r6                ldr    rDrive, [rDrive, #OD_Next%]
  1364.                 b      loop
  1365. v/; Creates full pathname for root on a drive
  1366. wO; Entry r1 => start ; Exit r1 => end                  ;*rDrive => OverBlock
  1367. x+.drivePathname  stmfd   r13!, {r0, r14}
  1368. y3                add     r0, rDrive, #OD_FSName%
  1369. z"                bl      strcpy
  1370. {I                mov r0, #
  1371. (":"): strB r0, [r1], #1: strB r0, [r1], #1
  1372. |2                add     r0, rDrive, #OD_IName%
  1373. }"                bl      strcpy
  1374. ~6                mov r0, #
  1375. ("."): strB r0, [r1], #1
  1376. 6                mov r0, #
  1377. ("$"): strB r0, [r1], #1
  1378. C                mov r0, #     0  : strB r0, [r1], #1  ; BIZARRE
  1379. +                ldmfd   r13!, {r0, pc}^
  1380. '.SFloppydisc equs "floppydisc" +bl$
  1381. ..SHarddisc   equs "harddisc"   +bl$: align
  1382. F; Calculate width of the current drive entry sprite (current mode)
  1383. ; Entry rDrive, r9
  1384. /.spriteSize    stmfd   r13!, {r0 - r7, r14}
  1385. S               mov     r0, #40                        ; Read sprite information
  1386. e               add     r2, rDrive, #OD_ISprite% +1    ; Sprite name, after inital 'S' in indirect
  1387. +               swi     "XWimp_SpriteOp"
  1388. e               bVC     spriteSize1                    ; Was the sprite found? >Yes Jump past this
  1389. 1               tst     r9, #Flags_SprCorrupt%
  1390. :               blNE    retError                       
  1391. b               orrEQ   r9, r9, #Flags_SprCorrupt%     ; Mark that we have bodged a sprite name
  1392. a               tst     r9, #Flags_Hard%               ; What type of drive do we think it is?
  1393. Y               adrEQ   r0, SFloppydisc                ;} both of these sprites should
  1394. e               adrNE   r0, SHarddisc                  ;} exist as they are put of the ROM sprites
  1395. O               add     r1, rDrive, #OD_ISprite% +1    ; Set new sprite name
  1396. !               bl      strcpy
  1397. 6               add     r2, rDrive, #OD_ISprite% +1
  1398. S               mov     r0, #40                        ; Read sprite information
  1399. +               swi     "XWimp_SpriteOp"
  1400. R.spriteSize1   movVC   r0, #&100                      ; Pointer to sprite name
  1401. L               movVC   r1, #1                         ; Wimp sprite area
  1402. O               addVC   r6, r12, #DT_Space%            ; Scale factors block
  1403. W               movVC   r7, #0                         ; No colour translation table
  1404. /               swiVC   "XWimp_ReadPixTrans"
  1405. /               ldmVSfd r13!, {r0 - r7, pc}^
  1406. 5               ldr     r2, [r12, #DT_XEigfactor%]
  1407. )               mov     r3, r3, LSL r2
  1408. '               ldr     r0, [r6, #0]
  1409. %               mul     r0, r3, r0
  1410. '               ldr     r1, [r6, #8]
  1411.                bL      udiv
  1412. 4               str     r0, [rDrive, #OD_SWidth%]
  1413. 4               ldr     r1, [rDrive, #OD_IWidth%]
  1414. !               cmp     r0, r1
  1415. 4               strGT   r0, [rDrive, #OD_IWidth%]
  1416. .               ldmfd  r13!, {r0 - r7, pc}^
  1417. &; Load word from unknown alignment
  1418. ; Entry r0 => from
  1419. (; Exit  r0 => from  r1 == word value
  1420. *.loadWord      stmfd   r13!, {r2 - r3}
  1421. %               bic     r2, r0, #3
  1422. '               ldmia   r2, {r1, r3}
  1423. %               and     r2, r0, #3
  1424. )               movS    r2, r2, LSL #3
  1425. )               movNE   r1, r1, LSR r2
  1426. &               rsbNE   r2, r2, #32
  1427. -               orrNE   r1, r1, r3, LSL r2
  1428. *               ldmFD   r13!, {r2 - r3}
  1429. "               movS    pc, r14
  1430. !; Simple string copy function
  1431.  ; Entry r0 => from; r1 => to
  1432. /; Exit  r0 => from; r1 => 0 terminate of to
  1433. -.strcpy        stmfd  r13!, {r0, r2, r14}
  1434. &.loop          ldrB   r2, [r0], #1
  1435. %               cmp    r2, #
  1436. (" ")
  1437. &               strB   r2, [r1], #1
  1438.                bGE    loop
  1439. $               sub    r1, r1, #1
  1440. -               ldmfd  r13!, {r0, r2, pc}^
  1441. ; Simple string compare
  1442. !; Entry r0 =>one    r1 => two
  1443. ; Exit LT/EQ/GT set
  1444. /.strcmp        stmfd   r13!, {r0 - r3, r14}
  1445. '.loop          ldrB    r2, [r0], #1
  1446. '               ldrB    r3, [r1], #1
  1447. !               cmp     r2, r3
  1448. .               ldmNEfd r13!, {r0 - r3, pc}
  1449. R               cmp     r2, #32                        ; String terminated yet?
  1450. U               bGE     loop                           ; >No  So process next char
  1451. I               cmp     r2, r2                         ; Ensure EQ set
  1452. .               ldmfd   r13!, {r0 - r3, pc}
  1453. !; r0 
  1454.  r1 = r0 ; r0 
  1455.  r1 = r1
  1456. /.udiv          stmfd   r13!, {r2 - r3, r14}
  1457. !               mov     r3, r1
  1458. )               cmp     r3, r0, LSR #1
  1459. ).loop          movLS   r3, r3, LSL #1
  1460. )               cmp     r3, r0, LSR #1
  1461.                bLS     loop
  1462. !               mov     r2, #0
  1463. !.loop          cmp     r0, r3
  1464. %               subCS   r0, r0, r3
  1465. %               adc     r2, r2, r2
  1466. )               mov     r3, r3, lsr #1
  1467. !               cmp     r3, r1
  1468.                bHS     loop
  1469. !               mov     r1, r0
  1470. !               mov     r0, r2
  1471. /               ldmfd   r13!, {r2 - r3, pc}^
  1472. defineMemory(A%)
  1473. fill(0, A%)
  1474. equsPadWithTo(string$, pad%, length%)
  1475.  This stores the string$. Ensuring it is pad% terminated, and altogether
  1476.  takes length% bytes. (Pads all with pad%)
  1477.  short$, temp$
  1478. #short$ = 
  1479. string$, length% - 1)
  1480. [OPT pass%: equs short$:]
  1481. ,temp$ = 
  1482. fill(pad%, length% - 
  1483. (short$))
  1484. fill(byte, count)
  1485.  This fills in count bytes with the value in byte
  1486.  loop
  1487.  count = 0 
  1488.  "Assigning zero space here!"
  1489.    =""
  1490.  loop = 1 
  1491.  count
  1492.    [ OPT pass%
  1493.          equb byte
  1494.  loop
  1495. [ OPT pass%
  1496.       ALIGN
  1497. copy(from%, to%, using%)
  1498. [ OPT pass%
  1499. ..copy          ldrB    using%, [from%], #1
  1500. ,               strB    using%, [to%], #1
  1501. &               cmp     using%, #32
  1502.                bGE     copy
  1503. ]: =""
  1504. adrl(c$,r%,addr%)
  1505.  c%,df%,byte_lo%,byte_hi%,opcode1%,opcode2%
  1506.  addr%=P% 
  1507.  (pass% 
  1508.  12)=0 
  1509.  P%+=8:O%+=8:=0
  1510. (addr%-P%)<256 
  1511. error("ADRL failed: Address within range when setting R"+
  1512. r%+" to "+
  1513. addr%,-1)
  1514. (addr%-P%)>65535 
  1515. error("ADRL failed: Address outside range when setting R"+
  1516. r%+" to "+
  1517. addr%,-1)
  1518.  c$=" " 
  1519.  c$="" c$="AL"
  1520. "EQNECSCCMIPLVSVCHILSGELTGTLEALNV",c$)
  1521.  c%=0 
  1522. error("ADRL failed: ARM condition code not recognized when setting R"+
  1523. r%+" to "+
  1524. addr%,-1) 
  1525.  c%=(c%-1) 
  1526. df%=addr%-P%-8
  1527. byte_lo%=
  1528. (df%) 
  1529. byte_hi%=
  1530. (df%) 
  1531.  &FF00
  1532.  df%>=0 
  1533.  3  opcode1%=(c%<<28)+&028F0000+(r%<<12)+byte_lo%
  1534. !A  opcode2%=(c%<<28)+&02800C00+(r%<<16)+(r%<<12)+(byte_hi%>>8)
  1535. #3  opcode1%=(c%<<28)+&024F0000+(r%<<12)+byte_lo%
  1536. $A  opcode2%=(c%<<28)+&02400C00+(r%<<16)+(r%<<12)+(byte_hi%>>8)
  1537. &,[OPT pass%:EQUD opcode1%:EQUD opcode2%:]
  1538. stmfd r13!, {r0 - r3}: swi &104: mov r0, r4: sub r1, r13, #20: mov r2, #16: swi "OS_ConvertInteger4":swi "OS_Write0":swi &100 + 
  1539. ("*"): swi &105: ldmfd r13!, {r0 - r3}
  1540.